package main

import "fmt"

// 冒泡排序: 交换类排序算法： 稳定算法

func BubbleSort(list []int) {
	n := len(list)

	// 进行n - 1轮迭代
	for i := 0; i < n - 1; i++ {
		// 在当前轮次中是否交换过: 提前退出的标志
		didSwap := false
		for j := 0; j < n - 1 - i; j++ {
			if list[j] > list[j + 1] {
				// 很多编程语言不允许使用：list[j], list[j+1] = list[j+1], list[j] 来交换两个值，交换两个值时必须建一个临时变量 temp
				// 来作为一个过渡，但是 Golang 语言允许我们不那么做，它会默认构建一个临时变量来中转
				list[j], list[j + 1] = list[j + 1], list[j]
				didSwap = true
			}
		}
		// 如果在当前轮次没有发生交换，说明数据序列已经排序完毕，直接返回即可。
		if !didSwap {
			return
		}
	}
}

func main() {

	list := []int{5, 9, 1, 6, 8, 14, 6, 49, 25, 4, 6, 3}
	BubbleSort(list)
	fmt.Println(list)

}
